/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufg.inf.pos.bd;

import br.ufg.inf.pos.br.utils.ConnectionFactory;
import br.ufg.inf.pos.br.utils.RegraDaoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author luan
 */
public class PatrimonioDaoImpl implements PatrimonioDao {

    private Connection connection = null;
    private Statement statement = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;

    private final String COLUMN_IDPATRIMONIO = "IDPATRIMONIO";
    private final String COLUMN_IDSITUACAO = "SITUACAO_IDSITUACAO";
    private final String COLUMN_IDLOCALIZACAO = "LOCALIZACAO_IDLOCALIZACAO";
    private final String COLUMN_FUNCIONARIO_IDUSUARIO = "FUNCIONARIO_IDUSUARIO";
    private final String COLUMN_PRODUTO_IDPRODUTO = "PRODUTO_IDPRODUTO";
    private final String COLUMN_NUMNFPATRIMONIO = "NUMNFPATRIMONIO";
    private final String COLUMN_PRODUTO_DATACOMPRAPATRIMONIO = "DATACOMPRAPATRIMONIO";
    private final String COLUMN_VALORPATRIMONIO = "VALORPATRIMONIO";

  
    @Override
     public boolean save(Patrimonio patrimonio) {
        StatusDao statusDao = new StatusDaoImpl();
        LocalizacaoDao localizacaoDao = new LocalizacaoDaoImpl();
        ProdutoDao produtoDao = new ProdutoDaoImpl();
        Localizacao localizacaoLido = null;
        Produto produtoLido = null;
        Categoria cat = null;
        int statusLido = 0;
       
        try {
            connection = ConnectionFactory.getConnection();

            String sql = "insert into ITEMPATRIMONIO (" + COLUMN_IDSITUACAO + ","
                    + "" + COLUMN_IDLOCALIZACAO + "," + COLUMN_FUNCIONARIO_IDUSUARIO + ","
                    + "" + COLUMN_PRODUTO_IDPRODUTO + "," + COLUMN_NUMNFPATRIMONIO + ""
                    + "," + COLUMN_PRODUTO_DATACOMPRAPATRIMONIO + "," + COLUMN_VALORPATRIMONIO + ""
                    + ") values (?,?,?,?,?,TO_DATE(?, 'DD.MM.YYYY'),?)";

            preparedStatement = connection.prepareStatement(sql);
            connection.setAutoCommit(false);
 // salvar o status
            try {
                if ((statusLido = statusDao.salvar(patrimonio.getStatus(), connection)) == 0) {
                    throw new RegraDaoException("Não foi possivel cadatrar o Status");
                }
                preparedStatement.setInt(1, statusLido);

            } catch (RuntimeException ex) {
                connection.rollback();
                close();
                throw new RegraDaoException(ex.getMessage());
            }
// busca a localizacao
            try {
                localizacaoLido = localizacaoDao.getByName(patrimonio.getLocalizacao().getNomeLocalizacao(), connection);
                preparedStatement.setInt(2, localizacaoLido.getIdLocalizacao());
            } catch (RuntimeException ex) {
                connection.rollback();
                close();
                throw new RegraDaoException(ex.getMessage());
            }
// set funcionario
            preparedStatement.setInt(3, patrimonio.getFuncionario().getId());
// busca o produto
            try {
                produtoLido = produtoDao.getByName(patrimonio.getProduto().getNome(), connection);
                preparedStatement.setInt(4, produtoLido.getIdProduto());
            } catch (RuntimeException ex) {
                connection.rollback();
                throw new RegraDaoException(ex.getMessage());
            }
// set notafiscal
             preparedStatement.setInt(5, patrimonio.getNumNF());
 // set data            
           preparedStatement.setString(6, converterData(patrimonio.getDataCompra()));
 // set valor
            preparedStatement.setDouble(7, patrimonio.getValor());
            preparedStatement.executeQuery();

        } catch (SQLException ex) {
            try {
                connection.rollback();
            } catch (SQLException ex1) {
                throw new RegraDaoException(ex1.getMessage());
            }
        } catch (ClassNotFoundException ex) {
            throw new RegraDaoException(ex.getMessage());
        } finally {
            try {
                connection.commit();
                connection.setAutoCommit(true);
                close();
                return true;
            } catch (SQLException ex) {
                close();
                throw new RegraDaoException(ex.getMessage());
            }
        }
    }

    private void close() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException("Erro ao fechar");
        }

    }

    public String converterData(Date data) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        String dataConvertida = formatter.format(data);
        return dataConvertida;
    }

}
